home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1997 December / PC Pro December 1997 CD-Rom coverdisc.iso / symantec / dbAnywh / JAVA.BIN / CLASSES.ZIP / sun / tools / tree / IdentifierExpression.class (.txt) < prev    next >
Encoding:
Java Class File  |  1996-12-14  |  5.9 KB  |  178 lines

  1. package sun.tools.tree;
  2.  
  3. import java.io.PrintStream;
  4. import java.util.Hashtable;
  5. import sun.tools.asm.Assembler;
  6. import sun.tools.asm.LocalVariable;
  7. import sun.tools.java.AmbiguousClass;
  8. import sun.tools.java.AmbiguousField;
  9. import sun.tools.java.ClassDefinition;
  10. import sun.tools.java.ClassNotFound;
  11. import sun.tools.java.CompilerError;
  12. import sun.tools.java.Constants;
  13. import sun.tools.java.Environment;
  14. import sun.tools.java.FieldDefinition;
  15. import sun.tools.java.Identifier;
  16. import sun.tools.java.Type;
  17.  
  18. public class IdentifierExpression extends Expression {
  19.    // $FF: renamed from: id sun.tools.java.Identifier
  20.    Identifier field_0;
  21.    FieldDefinition field;
  22.  
  23.    public IdentifierExpression(int var1, Identifier var2) {
  24.       super(60, var1, Type.tError);
  25.       this.field_0 = var2;
  26.    }
  27.  
  28.    public boolean equals(Identifier var1) {
  29.       return this.field_0.equals(var1);
  30.    }
  31.  
  32.    private long assign(Environment var1, long var2) {
  33.       if (this.field.isLocal()) {
  34.          LocalField var4 = (LocalField)this.field;
  35.          var2 |= 1L << var4.number;
  36.          ++var4.writecount;
  37.       }
  38.  
  39.       if (this.field.isFinal()) {
  40.          var1.error(super.where, "assign.to.final", this.field_0);
  41.       }
  42.  
  43.       return var2;
  44.    }
  45.  
  46.    private long get(Environment var1, long var2) {
  47.       if (this.field.isLocal()) {
  48.          LocalField var4 = (LocalField)this.field;
  49.          if ((var2 & 1L << var4.number) == 0L) {
  50.             var1.error(super.where, "var.not.initialized", this.field_0);
  51.             var2 |= 1L << var4.number;
  52.          }
  53.  
  54.          ++var4.readcount;
  55.       } else if (!this.field.isStatic() && (var2 & 1L) == 0L) {
  56.          var1.error(super.where, "access.inst.before.super", this.field_0);
  57.       }
  58.  
  59.       return var2;
  60.    }
  61.  
  62.    boolean bind(Environment var1, Context var2) {
  63.       try {
  64.          this.field = var2.getField(var1, this.field_0);
  65.          if (this.field == null) {
  66.             var1.error(super.where, "undef.var", this.field_0);
  67.             return false;
  68.          }
  69.  
  70.          super.type = this.field.getType();
  71.          if (!var2.field.getClassDefinition().canAccess(var1, this.field)) {
  72.             var1.error(super.where, "no.field.access", this.field_0, this.field.getClassDeclaration(), var2.field.getClassDeclaration());
  73.             return false;
  74.          }
  75.  
  76.          if (!var2.field.canAccess(var1, this.field)) {
  77.             var1.error(super.where, "no.static.field.access", this.field_0, this.field.getClassDeclaration());
  78.             return false;
  79.          }
  80.  
  81.          if (!var2.field.canReach(var1, this.field)) {
  82.             var1.error(super.where, "forward.ref", this.field_0, this.field.getClassDeclaration());
  83.             return false;
  84.          }
  85.  
  86.          return true;
  87.       } catch (ClassNotFound var4) {
  88.          var1.error(super.where, "class.not.found", var4.name, var2.field);
  89.       } catch (AmbiguousField var5) {
  90.          var1.error(super.where, "ambig.field", this.field_0, var5.field1.getClassDeclaration(), var5.field2.getClassDeclaration());
  91.       }
  92.  
  93.       return false;
  94.    }
  95.  
  96.    public long checkValue(Environment var1, Context var2, long var3, Hashtable var5) {
  97.       if (this.bind(var1, var2)) {
  98.          var3 = this.get(var1, var3);
  99.          var2.field.getClassDefinition().addDependency(this.field.getClassDeclaration());
  100.       }
  101.  
  102.       return var3;
  103.    }
  104.  
  105.    public long checkLHS(Environment var1, Context var2, long var3, Hashtable var5) {
  106.       return this.bind(var1, var2) ? this.assign(var1, var3) : var3;
  107.    }
  108.  
  109.    public long checkAssignOp(Environment var1, Context var2, long var3, Hashtable var5, Expression var6) {
  110.       return this.bind(var1, var2) ? this.assign(var1, this.get(var1, var3)) : var3;
  111.    }
  112.  
  113.    Type toType(Environment var1, Context var2) {
  114.       try {
  115.          return Type.tClass(var2.field.resolve(var1, this.field_0));
  116.       } catch (AmbiguousClass var6) {
  117.          var1.error(super.where, "ambig.class", var6.name1, var6.name2);
  118.       } catch (ClassNotFound var7) {
  119.       }
  120.  
  121.       ClassDefinition var3 = var2.field.getClassDefinition();
  122.       Identifier var4 = var3.getName().getQualifier();
  123.       Identifier var5 = var4 != null && var4 != Constants.idNull ? Identifier.lookup(var4, this.field_0) : this.field_0;
  124.       return Type.tClass(var5);
  125.    }
  126.  
  127.    public Expression inline(Environment var1, Context var2) {
  128.       return null;
  129.    }
  130.  
  131.    public Expression inlineValue(Environment var1, Context var2) {
  132.       if (this.field == null) {
  133.          return this;
  134.       } else {
  135.          try {
  136.             if (this.field.isLocal()) {
  137.                if (this.field.isFinal()) {
  138.                   Expression var3 = (Expression)this.field.getValue(var1);
  139.                   return (Expression)(var3 != null ? var3 : this);
  140.                } else {
  141.                   return this;
  142.                }
  143.             } else {
  144.                return (new FieldExpression(super.where, var2, this.field)).inlineValue(var1, var2);
  145.             }
  146.          } catch (ClassNotFound var4) {
  147.             throw new CompilerError(var4);
  148.          }
  149.       }
  150.    }
  151.  
  152.    public Expression inlineLHS(Environment var1, Context var2) {
  153.       return (Expression)(this.field.isLocal() ? this : (new FieldExpression(super.where, var2, this.field)).inlineValue(var1, var2));
  154.    }
  155.  
  156.    int codeLValue(Environment var1, Context var2, Assembler var3) {
  157.       return 0;
  158.    }
  159.  
  160.    void codeLoad(Environment var1, Context var2, Assembler var3) {
  161.       var3.add(super.where, 21 + super.type.getTypeCodeOffset(), new Integer(((LocalField)this.field).number));
  162.    }
  163.  
  164.    void codeStore(Environment var1, Context var2, Assembler var3) {
  165.       LocalField var4 = (LocalField)this.field;
  166.       var3.add(super.where, 54 + super.type.getTypeCodeOffset(), new LocalVariable(var4, var4.number));
  167.    }
  168.  
  169.    public void codeValue(Environment var1, Context var2, Assembler var3) {
  170.       this.codeLValue(var1, var2, var3);
  171.       this.codeLoad(var1, var2, var3);
  172.    }
  173.  
  174.    public void print(PrintStream var1) {
  175.       var1.print(this.field_0 + "#" + (this.field != null ? this.field.hashCode() : 0));
  176.    }
  177. }
  178.